home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Amiga CD-Sensation: Golden Games
/
Amiga CD-Sensation - Ausgabe 2 - Golden Games (1996)(GTI - Schatztruhe)(DE)[!].iso
/
Brain Activity
/
MinedOut
/
Cookie.c
next >
Wrap
C/C++ Source or Header
|
1993-02-14
|
16KB
|
456 lines
/*
* Cookie.c
*
* Call it with: dcc Mined_Out.c About.c Cookie.c Graphics.c Highscore.c
* Opal_12.c Play_Game.c Sound.c
* -o Mined_Out
* Mined_Out [-Test] [Columns Rows]
*/
/*
* This loads the Cookie.dat file and prints some Cookies.
* If you think the list generated here is mindbreaking than you are righ&%$#§$%§$"$
* Cookie.dat should not contain lines with Buffer_Size characters!!!
*/
/*
* Copyright by: Dieter Seidel
* Einsteinstraße 19
* 7410 Reutlingen
* Germany
*/
#include <exec/types.h>
#include <stdio.h> /* For fgets()
#include <string.h> /* For strcmp(), strlen() */
#include <intuition/intuition.h>
extern BOOL Test_Modus; /* Declared in Mined_Out.c */
extern UWORD WBenchScreen_Width, /* Declared in Mined_Out.c */
WBenchScreen_Height;
extern struct TextFont *TopazFont_9; /* Declared in Mined_Out.c */
extern struct TextFont *TopazFont_8; /* Declared in Mined_Out.c */
extern struct TextFont OpalFont; /* Declared in Opal_12.c */
extern struct IntuitionBase *IntuitionBase; /* Declared in Mined_Out.c */
extern struct GfxBase *GfxBase; /* Declared in Mined_Out.c */
const int Letter_Delay_Time = 2; /* 2 Tics delay for every Letter */
const int General_Delay_Time = 300; /* Give 6 secs for searching */
/* Cookie window */
int Quantity_Cookies; /* Number of Cookies in file Cookie.dat */
struct Cookie /* Contains the Cookies */
{
char *Text; /* 1st, 2nd 3rd Line, and so on */
struct Cookie *Next_Line;
};
struct Cookie_List
{
struct Cookie *Text_List;
struct Cookie_list *Next_Cookie;
};
struct Cookie_List *Cookies;
#define Buffer_Size 80 /* Only lines with <> 80 characters are read */
/* correctly (inclusive newline characters). */
/* Otherwise fgets(...) fools me. */
struct Window *Cookie_Window; /* Shows the Fortune Cookie */
struct NewWindow Cookie_New_Window =
{
0, /* LeftEdge */
0, /* TopEdge */
0, /* Width */
0, /* Height */
0, /* DetailPen */
1, /* BlockPen */
NULL, /* IDCMPFlags */
SMART_REFRESH| /* Flags */
WINDOWDRAG,
NULL, /* FirstGadget */
NULL, /* CheckMark */
(char *)"", /* Title */
NULL, /* Screen */
NULL, /* BitMap */
0, /* MinWidth */
0, /* MinHeight */
0, /* MaxWidth */
0, /* MaxHeight */
WBENCHSCREEN /* Type */
};
extern void Close_Libraries(void); /* Declared in Mined_Out.c */
extern void Close_Fonts(void); /* Declared in Mined_Out.c */
void Load_Cookies(void)
{
FILE *Cookie_File; /* Local variables for Load_Cookies */
char *File_Name = "Data/Cookie.dat";
struct Cookie_List *New_Cookie_List;
struct Cookie *New_String_List;
BOOL Buffer_Inserted; /* Detects the end of a cookie */
char Buffer[Buffer_Size]; /* Be sure that Cookie.dat contains */
/* no lines with Buffer_Size characters. */
Cookies = NULL;
Quantity_Cookies = 0; /* No Cookies loaded */
New_Cookie_List = NULL;
New_String_List = NULL;
Buffer_Inserted = FALSE;
Cookie_File = fopen(File_Name, "r"); /* Read Cookie.dat */
if (!Cookie_File)
if (Test_Modus)
printf("Unable to open Cookies.dat.\n");
else
; /* I hate this. Really. */
else
{ /* Now reading Cookie.dat */
while (fgets(Buffer, sizeof(Buffer), Cookie_File))
{
if (strlen(Buffer) == 1) /* Empty line readed. Next Cookie expected */
{
if (Buffer_Inserted)
Quantity_Cookies++;
Buffer_Inserted = FALSE;
}
else /* Insert String */
{
if (New_Cookie_List == NULL)
{
New_Cookie_List = (struct Cookie_List *) malloc(sizeof(struct Cookie_List));
Cookies = New_Cookie_List; /* Set start of Cookie List */
New_Cookie_List->Next_Cookie = NULL;
New_String_List = (struct Cookie *) malloc(sizeof(struct Cookie));
New_Cookie_List->Text_List = New_String_List;
New_String_List->Next_Line = NULL;
New_String_List->Text = (char *) malloc(strlen(Buffer));
strcpy(New_String_List->Text, Buffer);
Buffer_Inserted = TRUE;
}
else
{
if (Buffer_Inserted)
{
New_String_List->Next_Line = (struct Cookie *)
malloc(sizeof(struct Cookie));
New_String_List->Next_Line->Next_Line = NULL;
New_String_List->Next_Line->Text = (char *) malloc(strlen(Buffer));
strcpy(New_String_List->Next_Line->Text, Buffer);
New_String_List = New_String_List->Next_Line;
}
else
{
New_Cookie_List->Next_Cookie = (struct Cookie_List *)
malloc(sizeof(struct Cookie_List));
New_String_List = (struct Cookie *) malloc(sizeof(struct Cookie));
New_String_List->Next_Line = NULL;
New_String_List->Text = (char *) malloc(strlen(Buffer));
strcpy(New_String_List->Text, Buffer);
New_Cookie_List = New_Cookie_List->Next_Cookie;
New_Cookie_List->Next_Cookie = NULL;
New_Cookie_List->Text_List = New_String_List;
Buffer_Inserted = TRUE;
}
}
}
}
if (Buffer_Inserted) /* Cookie.dat does not end with */
Quantity_Cookies++; /* an newline character. */
fclose(Cookie_File); /* All readed from Cookie.dat. */
if (Test_Modus)
{
printf("%d Cookies readed. Now printing them.\n\n",Quantity_Cookies);
New_Cookie_List = Cookies;
if (New_Cookie_List)
New_String_List = Cookies->Text_List;
else
New_String_List = NULL; /* No Cookies loaded, so don't print them */
printf("Cookie:\n");
while (New_String_List)
{
printf("%s", New_String_List->Text);
New_String_List = New_String_List->Next_Line;
if (New_String_List == NULL)
{
printf("\nCookie:\n");
New_Cookie_List = New_Cookie_List->Next_Cookie;
if (New_Cookie_List)
New_String_List = New_Cookie_List->Text_List;
}
}
} /* Of Test_Modus */
}
}
void Remove_Cookie_List(void)
{
}
/* Get the Pointer to the n.th Cookie. */
struct Cookie_List *Get_Cookie_Pointer(void)
{
struct Cookie_List *Cookie_Pointer;
int Random_Number = rand();
if (Quantity_Cookies == 0)
return(NULL); /* No Cookies available */
else
{
Random_Number %= (Quantity_Cookies + 1);
Cookie_Pointer = Cookies;
while ((Random_Number > 1) && (Cookie_Pointer))
{
Cookie_Pointer = Cookie_Pointer->Next_Cookie;
Random_Number--; /* C Hackers would put this in the while Condition */
}
return(Cookie_Pointer);
}
}
int Get_Lines(struct Cookie_List *Cookie_To_Print)
{
int Count_Lines = 0; /* No lines countet */
struct Cookie *Next_Line;
if (Cookie_To_Print) /* Prevent Guru Meditation */
{
Next_Line = Cookie_To_Print->Text_List;
while (Next_Line)
{
Count_Lines++;
Next_Line = Next_Line->Next_Line;
}
}
return(Count_Lines);
}
int Count_Letters(struct Cookie_List *Cookie_To_Print)
{
int Count_Letters = 0;
struct Cookie *Next_Line;
if (Cookie_To_Print)
{
Next_Line = Cookie_To_Print->Text_List;
while (Next_Line)
{
Count_Letters += strlen(Next_Line->Text);
Next_Line = Next_Line->Next_Line;
}
}
return(Count_Letters);
}
int Get_Max_Line_Length(struct Cookie_List *Cookie_To_Print)
{
int Max_Line_Length = 0; /* Set minimum length */
struct Cookie *Next_Line;
if (Cookie_To_Print)
{
Next_Line = Cookie_To_Print->Text_List;
while (Next_Line)
{
if (strlen(Next_Line->Text) > Max_Line_Length)
Max_Line_Length = strlen(Next_Line->Text);
Next_Line = Next_Line->Next_Line;
}
}
return(Max_Line_Length);
}
BOOL Print_Cookie(void)
{
struct Cookie_List *Cookie_To_Print; /* Local variables */
Cookie_New_Window.Title = (char *) "Fortune Cookie"; /* Set Window Title */
Cookie_To_Print = Get_Cookie_Pointer();
if (Cookie_To_Print == NULL)
{ /* Print `All Cookies are broken' */
Cookie_New_Window.Width = 330; /* 31 Letters * 10 Fontsize + 2*10 Border */
Cookie_New_Window.Height = 30;
Cookie_New_Window.LeftEdge = (WBenchScreen_Width - 303) / 2;
Cookie_New_Window.TopEdge = (WBenchScreen_Height - 28 ) / 2;
Cookie_Window = (struct Window *) OpenWindow(&Cookie_New_Window);
if (Cookie_Window == NULL)
{
printf("Could not open Fortune Cookie Window\n");
Close_Libraries();
Close_Fonts();
exit(1000);
}
SetAPen(Cookie_Window->RPort, 1);
SetDrMd(Cookie_Window->RPort, JAM1);
SetFont(Cookie_Window->RPort, TopazFont_9);
Move(Cookie_Window->RPort, 10, 22);
Text(Cookie_Window->RPort, "All Fortune Cookies are broken.", 31);
Delay(Letter_Delay_Time * 31 + General_Delay_Time);
if (Cookie_Window)
CloseWindow(Cookie_Window);
}
else
{ /* Print Cookie */
int How_Many_Lines = Get_Lines(Cookie_To_Print); /* Local variables */
int How_Many_Letters = Count_Letters(Cookie_To_Print);
int Max_Line_Length = Get_Max_Line_Length(Cookie_To_Print);
int Display_Row = 22; /* Row of the first line from the Cookie ... */
struct Cookie *Next_Line;
Cookie_New_Window.Width = Max_Line_Length * 8 + 2 * 10;
if (Cookie_New_Window.Width > WBenchScreen_Width)
{
if (Test_Modus)
printf("The width of the Cookie is to large. Can't open Window!\n");
return(FALSE);
}
Cookie_New_Window.Height = 21 + 8 * How_Many_Lines;
if (Cookie_New_Window.Height > WBenchScreen_Height)
{
if (Test_Modus)
printf("The height of the Cookie is to large. Can't open Window!\n");
return(FALSE);
}
Cookie_New_Window.LeftEdge = (WBenchScreen_Width - Cookie_New_Window.Width ) / 2;
Cookie_New_Window.TopEdge = (WBenchScreen_Height - Cookie_New_Window.Height) / 2;
Cookie_Window = (struct Window *) OpenWindow(&Cookie_New_Window);
if (Cookie_Window == NULL)
{
printf("Could not open Fortune Cookie Window\n");
Close_Libraries();
Close_Fonts();
exit(1000);
}
SetAPen(Cookie_Window->RPort, 1);
SetDrMd(Cookie_Window->RPort, JAM1);
SetFont(Cookie_Window->RPort, TopazFont_8);
Next_Line = Cookie_To_Print->Text_List;
while (Next_Line)
{
Move(Cookie_Window->RPort, 10, Display_Row);
Text(Cookie_Window->RPort, Next_Line->Text, strlen(Next_Line->Text) - 1);
Next_Line = Next_Line->Next_Line;
Display_Row += 8;
}
Delay(Letter_Delay_Time * How_Many_Letters + General_Delay_Time);
if (Cookie_Window)
CloseWindow(Cookie_Window);
}
return(TRUE);
}
BOOL Print_Cookie_Dead(void)
{
struct Cookie_List *Cookie_To_Print; /* Local variables */
Cookie_New_Window.Title = (char *) "You are DEAD!"; /* Set Window Title */
Cookie_To_Print = Get_Cookie_Pointer();
if (Cookie_To_Print == NULL)
{ /* Print `All Cookies are broken' */
Cookie_New_Window.Width = 330; /* 31Letters * 10Fontsize + 2*10Border */
Cookie_New_Window.Height = 30;
Cookie_New_Window.LeftEdge = (WBenchScreen_Width - 303) / 2;
Cookie_New_Window.TopEdge = (WBenchScreen_Height - 28 ) / 2;
Cookie_Window = (struct Window *) OpenWindow(&Cookie_New_Window);
if (Cookie_Window == NULL)
{
printf("Could not open Fortune Cookie Window\n");
Close_Libraries();
Close_Fonts();
exit(1000);
}
SetAPen(Cookie_Window->RPort, 1);
SetDrMd(Cookie_Window->RPort, JAM1);
SetFont(Cookie_Window->RPort, TopazFont_9);
Move(Cookie_Window->RPort, 10, 22);
Text(Cookie_Window->RPort, "All Fortune Cookies are broken.", 31);
Delay(Letter_Delay_Time * 31 + General_Delay_Time);
if (Cookie_Window)
CloseWindow(Cookie_Window);
}
else
{ /* Print Cookie */
int How_Many_Lines = Get_Lines(Cookie_To_Print); /* Local variables */
int How_Many_Letters = Count_Letters(Cookie_To_Print);
int Max_Line_Length = Get_Max_Line_Length(Cookie_To_Print);
int Display_Row = 22 + 36; /* Row of the first line from the Cookie ... */
struct Cookie *Next_Line;
Cookie_New_Window.Width = Max_Line_Length * 8 + 2 * 10;
if (Cookie_New_Window.Width > WBenchScreen_Width)
{
if (Test_Modus)
printf("The width of the Cookie is to large. Can't open Window!\n");
return(FALSE);
}
if (Cookie_New_Window.Width < (42 * 9 + 2 * 10 + 40))
Cookie_New_Window.Width = 42 * 9 + 2 * 10 + 40;
/* 44 characters for the text from god * 9 character size */
/* + 2 * 10 Border + 2 * 20 extra border. */
Cookie_New_Window.Height = 21 + 36 + 8 * How_Many_Lines;
if (Cookie_New_Window.Height > WBenchScreen_Height)
{
if (Test_Modus)
printf("The height of the Cookie is to large. Can't open Window!\n");
return(FALSE);
}
Cookie_New_Window.LeftEdge = (WBenchScreen_Width - Cookie_New_Window.Width ) / 2;
Cookie_New_Window.TopEdge = (WBenchScreen_Height - Cookie_New_Window.Height) / 2;
Cookie_Window = (struct Window *) OpenWindow(&Cookie_New_Window);
if (Cookie_Window == NULL)
{
printf("Could not open Fortune Cookie Window\n");
Close_Libraries();
Close_Fonts();
exit(1000);
}
SetAPen(Cookie_Window->RPort, 1);
SetDrMd(Cookie_Window->RPort, JAM1);
SetFont(Cookie_Window->RPort, &OpalFont);
Move(Cookie_Window->RPort, 30, 22);
Text(Cookie_Window->RPort, "After you reached heaven, God speaks to you:", 44);
Move(Cookie_Window->RPort, 66, 34);
Text(Cookie_Window->RPort, "`I give you another chance on earth'", 36);
Move(Cookie_Window->RPort, 30, 46);
Text(Cookie_Window->RPort, "and hands an Fortune Cookie to you.", 35);
SetAPen(Cookie_Window->RPort, 1);
SetDrMd(Cookie_Window->RPort, JAM1);
SetFont(Cookie_Window->RPort, TopazFont_8);
Next_Line = Cookie_To_Print->Text_List;
while (Next_Line)
{
Move(Cookie_Window->RPort, 10, Display_Row);
Text(Cookie_Window->RPort, Next_Line->Text, strlen(Next_Line->Text) - 1);
Next_Line = Next_Line->Next_Line;
Display_Row += 8;
}
Delay(Letter_Delay_Time * How_Many_Letters + General_Delay_Time);
if (Cookie_Window)
CloseWindow(Cookie_Window);
}
return(TRUE);
}